﻿using System;
using System.Collections.Generic;
using System.Text;

namespace iTunes
{
    class IR
    {
        private List<int> tab;
<<<<<<< .mine
        private int firstChangeIndex;
        private int lastChangeIndex;
=======
        private List<int> var;
        private int firstChangeIndex;
        private int lastChangeIndex;
>>>>>>> .r169

        //valeur considérée comme valeur par defaut lorsque l'IR n'envoit rien
        static int LOW_VALUE = 7;

        public IR()
        {
            tab = new List<int>();
            var = new List<int>();
        }

<<<<<<< .mine
        public void Add(int val)
        {
            tab.Add(val);
        }
        
        public bool isOn()
=======
        public List<int> getVarTab()
>>>>>>> .r169
        {
<<<<<<< .mine
            if (tab.Count > 20 && getAverage()>50) return true;
=======
            return this.var;
        }

        public int getTotalVar()
        {
            int sum=0;

            foreach (int s in var)
            {
                sum = sum + s;
            }
            return sum;
        }

        public void Add(int val)
        { 
            int deplacement=0;
            tab.Add(val);
            
            if (tab.Count >= 2) deplacement = tab[tab.Count - 1] - tab[tab.Count - 2];

            var.Add(deplacement);
            this.computeFirstChangeIndex();
            this.computeLastChangeIndex();
        }

        public int getAverageOfLastValues(int nbval)
        {
            int avg = 0;
            List<int> list = getLastValues(nbval);
            for (int i = 0; i < list.Count; i++)
            {
                avg = avg + list[i];
            }
            avg = avg / list.Count;
            return avg;
        }

        public List<int> getLastValues(int nbval)
        {
            List<int> list = new List<int>();
            if ( tab.Count<=nbval ) 
            for (int i=tab.Count-nbval;i<nbval;i++)
            {
                list.Add(tab[i]);
            }

            return list;
        }

        public bool isOn(int nb)
        {
            if (tab.Count >= nb && getAverage()>50) return true;
>>>>>>> .r169
            else return false;
        }

        //fonction pour faire une équivalence entre le nombre de mesures prises et la durée
        //retourne une valeur en msec
        public int convertToMSec()
        {
            int x = 1; // 1 valeur par ms (faux surement, à modifier)

            return getTab().Count * x;
        }
        public int getLastChangeIndex()
        {
            return this.lastChangeIndex;
        }
        public int getFirstChangeIndex()
        {
            return this.firstChangeIndex;
        }
        //retourne le dernier changement du tableau tab
        public void computeLastChangeIndex()
        {
            List<int> temp = new List<int>(this.getTab());

            int count = temp.Count;
            //contient l'index du dernier changement du tableau tab
            int order = 0;

            for (int i = temp.Count-1; i >= 0; i--)
            {
                if (temp[i] == LOW_VALUE)
                {
                    order = i;
                    break;
                }
            }

            this.lastChangeIndex=order;
        }


        //retourne le premier changement du tableau tab
        public void computeFirstChangeIndex()
        {
            List<int> temp = new List<int>(this.getTab());

            //contient l'index du premier changement du tableau tab
            int order = 0;

            for (int i = 0; i < temp.Count; i++)
            {
                if (temp[i] != LOW_VALUE)
                {
                    order = i;
                    break;
                }
            }
            this.firstChangeIndex = order;
        }

        public int getAverage()
        {
            if (tab.Count > 0)
            {
                int moy = 0;

                foreach (int s in tab)
                {
                    moy = (moy + s);
                }
                moy = moy / tab.Count;
                return moy;
            }
            else return 0;     
        }

        // return true s'il y a plus de x changements
        // return false s'il y a trop peu de chgts pour que le tableau soit utile (ie pas de changements pendant assez longtemps
        // pour indiquer qu'il y a eu un mouvement)
        public bool checkChanges()
        {
            // int nbChanges=0;
            // int previousValue = 0;

            // s'il y a trop peu de valeurs dans le tableau, le mouvement n'est pas digne d'être analysé
            if (tab.Count < 100) return false;

            /*
            //a chak string de tab
            foreach(string c in tabIR1) {
                //convertis la string c en int n
                   int n = int.Parse(c);
                //si n != valeure precedente on incremente nbChanges
                nbChanges = (n = previousValue ? 1 : 0) + nbChanges;
                // la 'nouvelle valeure precedente' est mise
                previousValue = n;
            }

            //sinon le nombre de changement est superieur à XXXX
            //le tab est digne d'etre traite et on retourne vrai
            if (nbChanges > 100) return true;
            //on retourne faux par defaut
            
             */
            return true;
        }

        public List<int> getTab()
        {
            return this.tab;
        }

        public void setTab(List<int> t)
        {
            this.tab = t;
        }
    }
}
